iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 7

2023鐵人賽Day 7 Go設計哲學-1

  • 分享至 

  • xImage
  •  

看到現在,我們已經掌握了幾個基本的觀念,接下來我要談的是Go的設計哲學
因為了解Go的設計哲學,你才知道該怎麼面對這個語言

追求簡單,少即是多

Gopher喜歡Go的部份原因有哪些

  • 高性能
  • 編譯速度快
  • 簡單,最少語法
  • 強大的社群
  • 內建垃圾回收機制

Go 語言的核心團隊明確表示,他們寧可讓語言保持簡單,只包含真正有用且不會造成誤解的特性,而不是嘗試融合各種現代程式語言的特性,Go選擇做減法,選擇了“簡單”,他們把複雜性留給了語言自身的設計以及實現,就是說,複雜的開發Go的團隊已經幫你完成啦,簡單易用的部分留給Gopher們

  • 沒有繼承:Go 使用組合(composition)而不是繼承,因此避免了傳統的類型層次結構問題
  • 沒有例外(exception):在 Go 中不會看到像其他語言(如 Java, C++, Python)中的 try/catch/finally 或類似的結構
  • 記憶體內總是會初始化零值
  • 接口(interface)主要是用來定義一組方法的規範或協議,而不像其他語言中的接口那樣還可能包含資料字段

Go設計者推崇“最小方式”思考方式,即一件事情僅有一種方式或數量盡可能少的方式去完成

偏好組合,正交解耦

我之前是寫ruby,ruby是一個oop語言,也就是代表他有類型系統即繼承系統。
那go呢,go不支持傳統的類繼承,在go語言我們找不到經典的oop語法元素,類型及繼承
那...go豈不是寫什麼都耦合再一起了嗎,不是,go語言遵從的設計哲學也是組合

  1. 類型系統

    • Go 確實具有一個明確的類型系統。所有的變量都有一個在編譯時確定的類型。
    • Go 使用結構體(structs)來表示複合的資料結構,不支持傳統的"類(class)"概念。
  2. 方法與類型

    • 在 Go 中,任何類型(包括基本類型)都可以擁有方法。
    • 方法的定義與類型的定義是分開的,但它們必須在同一個包內。
  3. 接口

    • 接口在 Go 中定義了一個方法的集合。
    • 類型不需要明確地聲明它們實現了某個接口。只要其方法與接口匹配,它就被視為隱式地實現了該接口。
  4. 包的結構

    • 每個 Go 包都是獨立的,它有自己的獨特導入路徑。
    • 儘管文件系統上的目錄結構可能看起來像包含子包,但在 Go 的視角,每個包都是平等且獨立的,沒有"子包"的概念。

組合為王

  • 孤島性:Go 的類型(無論是結構體、基本類型或其他)、接口和包,都是設計成獨立的元素。它們本身不直接與其他元素有繼承或隱式的依賴關係。

  • 建立關聯:為了在實際應用中創建有用的程序,我們需要這些獨立元素之間建立某種關聯,或者說是"耦合"。

  • 組合為王:Go 鼓勵使用"組合"(composition)作為建立關聯的主要方式。這與其他語言中的繼承方式形成對比。組合不僅僅是一種選擇,而在 Go 中,它基本上是連接不同元素的唯一方式。

type embedding

type poolLocal struct {
  private interface{}
  shared []interface{}
  Mutex
  pad [128]byte
}

我們在poolLocal加了類型Mutex,被加入的Mutex的方法集合會被加到poolLocal,這種很像oop的繼承,但原理不同,這是一個語法糖,實際上poolLocal與Mutex兩者是互相不知道彼此的存在的,poolLocal會有Mutex的兩個方法,但實際執行這兩個方法時,會透過Mutex的實體來執行

interface

type ReadWriter interface {
  Reader
  Writer
}

interface是一個分法集合,但實現了與實現者關係是隱式的,他讓程序的耦合度降到最低,同時連接了部分的紐帶,隱式的interface實現了不經意間滿足依賴抽象,接口隔離

Type Embedding(類型嵌入)為類型提供了垂直擴展的能力,而 Interface(接口)則是水平擴展的關鍵

參考書籍:Go語言精進之路


上一篇
2023鐵人賽Day 6 Go X 介面
下一篇
2023鐵人賽Day 8 理解Go設計哲學-2
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言